1 Introducción

En Colombia la producción agricola se enfrenta a retos complejos como el cambio climático, la interrupción de suministros y la competencia externa. Factores como la inflación, el aumento de precios de insumos, transporte, almacenamiento, fenómenos climáticos y malos negocios con intermediarios terminan afectando al productor [2] (Portafolio). Por ejemplo, el diario Portafolio reporta que hace 18 meses producir una hectárea de papa costaba alrededor de $22 millones y los valores de hoy están cercanos a los $40 millones por hectárea. Además de esto los pequeños y medianos productores tienen que competir con importaciones de paises tecnificados donde la producción es mas económica y eficiente. La papa es un caso importante, es un producto esencial para muchos hogares y hoy existe un exceso de oferta en comparación con la demanda[1] (Razon publica).

Desde esta problemática consideramos que es fundamental conocer las tendencias del mercado y los factores que afectan a los cultivos. En el siguiente proyecto realizamos algunos análisis para ayudar a los productores a tomar desiciones informadas y que estas les permitan ser competitivos en el mercado.

2 Metodología

2.1 ¿Cómo abordaremos el problema?

Utilizaremos datos históricos de los precios de diferentes productos agricolas en diferentes centros mayoristas del pais, nos centramos en los datos producidos por el departamento nacional de estadística, DANE. Elegimos la región andina de Colombia para acotar el problema, y también nos enfocamos en los productos cosechados en esta región. Analizaremos la variabilidad del precio a lo largo del tiempo con el objetivo de identificar los productos más estables, buscando identificar los productos que podrían tener una rentabilidad más segura. Usaremos datos de algunos factores relacionado en la cadena de producción o suministro, como la inflación, los precios de diferentes insumos y los patrones de precios que siguen estos productos anualmente.

2.2 ¿Qué medidas estadísticas usaremos?

Para analizar los datos utilizaremos principalmente las medidas de tendencia central estadística como la media y la desviación estándar para medir la variabilidad de los productos a lo largo del tiempo. A su vez usaremos la correlación para buscar posibles relaciones entre insumos y los productos.

2.3 Nuestro objetivo: Generar recomendaciones para la producción agrícola

El objetivo de nuestro proyecto es contribuir a la toma de decisiones informadas en la producción agrícola de pequeña o mediana escala, desde el análisis de datos reales de variables relacionadas al precio de los productos.

2.4 📚 Librerías y funciones usadas

A continuación un resumen de las librerías usadas y su propósito.

Librería Propósito
RColorBrewer Generación de paletas de colores
readxl Lectura de archivos Excel
ggplot2 Creación de gráficos estadísticos
tidyverse Conjunto de herramientas para el análisis de datos
cowplot Combinación de gráficos
lubridate Manejo de fechas y horas
patchwork Combinación de gráficos
tidyr Transformación de datos
dplyr Selección, manipulación y agregación de datos
lubridate Manejo de fechas y horas
skimr Exploración de datos
kableExtra Mejorar la apariencia de las tablas generadas por la función kable() de la librería knitr
knitr Generar documentos reproducibles en R que contengan código R, texto, tablas y gráficos
DT Crear tablas interactivas en R que pueden ser utilizadas para explorar datos de manera interactiva

Definimos algunos parámetros diccionarios y variables para los análisis.

3 🗒 Datos

3.1 💾​ Fuentes: obtener los datos

En nuestros análisis utilizamos conjuntos de datos de dos fuentes

  1. DANE (2023) Sistema de Información de Precios y Abastecimiento del Sector Agropecuario (SIPSA). Gobierno de Colombia. Recuperado el 15 de Noviembre de 2023 de: https://www.dane.gov.co/index.php/estadisticas-por-tema/agropecuario/sistema-de-informacion-de-precios-sipsa#precios-mayoristas.
  2. DANE (2023) Inflacion total y meta. Banco de la Republica. Recuperado el 15 de Noviembre de 2023 de: https://www.banrep.gov.co/es/estadisticas/inflacion-total-y-meta

3.2 Datos históricos de precios mayoristas

Datos recolectados por el DANE como parte de la operación SIPSA (Sistema de información de Precios y Abastecimiento) desde el 2012 hasta la fecha. Los conjuntos de datos disponbles son: Precios Mayoristas, Abastecimientos de Alimentos e Insumos y Factores Asociados a la Producción Agropecuaria. Estos datos se recolectan mediante entrevista personal con formulario de papel, en el siguiente enlace se encuentra la ficha técnica https://microdatos.dane.gov.co/index.php/catalog/776

Las series históricas de precios mayoristas tienen 5 variables, la fecha en la cual se tomó la medición del precio del producto, el grupo al que pertenece el producto, el producto como tal, el mercado en donde se tomó la medición y el precio promedio por kilogramo.

A continuación información sobre los datos.

## [1] 1146
Características del dataset
Fecha Grupo Producto Ciudad Mercado Precio
Min. :2013-01-01 00:00:00 Length:603782 Length:603782 Length:603782 Length:603782 Min. : 82
1st Qu.:2015-09-01 00:00:00 Class :character Class :character Class :character Class :character 1st Qu.: 1429
Median :2018-05-01 00:00:00 Mode :character Mode :character Mode :character Mode :character Median : 2990
Mean :2018-05-04 08:25:59 NA NA NA NA Mean : 6369
3rd Qu.:2021-01-01 00:00:00 NA NA NA NA 3rd Qu.: 8500
Max. :2023-10-01 00:00:00 NA NA NA NA Max. :184278
Valores únicos por columna
x
Fecha 130
Grupo 9
Producto 383
Ciudad 70
Mercado 110
Precio 31304
## [1] "Total filas  603782"

3.3 Datos históricos de insumos

La seres históricas de insumos tienen dos distintos sets de variables, ya que la tercer hoja del documento alberga el listado de los insumos, con 3 variables, el grupo del insumo, el subgrupo y el nombre del insumo/factor. Luego las demás hojas representan cada una un subgrupo ya establecido en la hoja del listado, estas cuentan con 8 variables, el año en que se tomó la medida, el mes, el codigo del departamento, el nombre del departamento, el codigo del municipio, el nombre del municipio, el nombre del producto, la presentación del producto y el precio promedio.

Leemos los archivos y damos un primer vistazo a los datos.

insumos2023 <- readxl::read_xlsx(paste(folder, "/series-historicas-insumos-2021-2023.xlsx", sep = ""), sheet = 5, range = "A9:I61985")
insumos2020 <- readxl::read_xlsx(paste(folder, "/series-historicas-insumos-2013-2020.xlsx", sep = ""), sheet = 5, range = "A10:I99845")

insumos <- rbind.data.frame(insumos2020, insumos2023)
head(insumos) 
tail(insumos)
print("Variables disponibles")
## [1] "Variables disponibles"
names(insumos)
## [1] "Año"                       "Mes"                      
## [3] "Código departamento"       "Nombre departamento"      
## [5] "Código municipio"          "Nombre municipio"         
## [7] "Nombre del producto"       "Presentación del producto"
## [9] "Precio promedio"

Convertimos la fecha a una nueva columna en formato YYYY-MM-DD.

Número de NaN:

## [1] 0

Algunos parámetros estadísticos.

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2867   16667   37000   57468   80175  460000
Data summary
Name insumos
Number of rows 161811
Number of columns 10
_______________________
Column type frequency:
character 7
Date 1
numeric 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Año 0 1 4 4 0 11 0
Código departamento 0 1 2 2 0 25 0
Nombre departamento 0 1 4 18 0 25 0
Código municipio 0 1 5 5 0 192 0
Nombre municipio 0 1 4 27 0 190 0
Nombre del producto 0 1 3 50 0 268 0
Presentación del producto 0 1 7 23 0 17 0

Variable type: Date

skim_variable n_missing complete_rate min max median n_unique
Fecha 0 1 2013-01-01 2023-10-01 2019-11-01 130

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Mes 0 1 6.43 3.39 1.00 4.00 6 9 12 ▇▆▆▆▇
Precio promedio 0 1 57467.55 55905.63 2866.67 16666.67 37000 80175 460000 ▇▁▁▁▁

Productos presentes en el dataset:

Insumos reportados
10-20-20, 10-30-10, 13-26-6, 14-4-23-4, 15-15-15, 17-6-18-2(Mg), 18-18-18-1(Mg), 25-4-24, 28-4-0-6(S), Agrimins 8-5-0-6, Biocel Foliar, Boroliq Sl, Borozinco Foliar, Cal Agrícola, Cal Dolomita, Cerostress, Cloruro de Potasio 0-0-60, Cosmocel: 20-30-10 + Edta y Em, Crecer 500, Desarrollo: 30-7-6, Florescencia: 10-28-19, Formador 2000, Fosfato Diamónico (DAP) 18-46-0, Fosfostress, Frutoka: 3-0-40, Germi-K, Humita 15, Hydran Nova 19-4-19-3, Kelatex Calcio, Kelatex Magnesio, Kelatex Zinc, Klip - K Calcio-Boro, Klip Boro, Llenado de Grano 8-0-10 + Boro y Cobre, Nitromag 21-0-0-7, Nutrifoliar Completo, Nutrimins, 18-18-18, Omex Bio 8, Omex K-41, Potreros: 31-8-8-2, Rafos 12-24-12-2, Sulfato de Amonio (Sam) 21-0-0-24(S), Terra Sorb - Foliar, Todo en uno, Tottal, Urea 46%, Wuxal Calcio, Wuxal Tapa Negra, Wuxal Tapa Roja, Agrodesarrollo 25-3-5, Agrofast, Aminoset, Borozinco 240 Gr, Foscrop Pk: 0-30-20, Globafol, Raizal 400: 9-45-11, Sulcamag, Terra Sorb 4 - Radicular, Nutri 15, 10-20-30, 13-26-6-3(CaO) + menores con lombricompost, 25-15-0, A-Micsur, Aminoplant, B-Timin Ag: 25-4-25, Cal Dolomita 65-33, Cal Dolomita 70-25, Compuesto Abimgra, Foliagro 8-23-8 + Secundarios y Em, Hojas, Fertilizante Orgánico de Lombriz San Rafael, Kafe Caldas 25-3-19-3, , Microcoljap NPK, Poliquel Multi, Triple Q, Triplehoja, 15-4-23-4(Mg), Amino K-3, Isabion, Marax, Dolfos, Cal Dolomita 57-35, Fosfato Diamónico (DAP) 21-53-0, Poliquel Calcio, Abono Orgánico, 10-30-10 + Secundarios, Fertigro 8-24-0, Todo en Uno, 17-6-18-6(Mg), 25-15-0-2(Mg), Biozyme Tf, Powerplex, Nitron Doble N Granulado: 26-0-0, 10-20-30-1, Agro-K: 0-39-52, Foss 61 Cristales, Kadostim, Microessentials Sz: 12-40-0-10(S), Zinboquim, Cal dolomita 70-25, Cal dolomita, Cosmo-R: 14-8-19 + Edta Y Em, Fertilimor, K-Fol: 0-20-50 Cristales, Cal dolomita 57-35, Unoagro 41-3-3, Nitrabor (Nitrato De Ca+B): 15-0-0-26, Hidran: 19-4-19-3, Sulfato de Potasio 0-0-50-18(S), Calfos Granulado, Nitromag, Nutrifos Agrofert-K, Cal dolomita 65-33, : 40-3-3, Amida S (Urea-Sulfato De Amonio), Agrimins Completo, Agrimins Inicio, Nutrisuelo, 13-26-10-3(Mg), 27-11-11-2(Mg), Abonissa Kikes Cauca, Afek I, Afek Ii, Aminofer, Aminoquim, Ana-Bor, Arroz Fase 3: 24-0-17-5-6, Boro 21, Boro-K, Calfomag, Cosmo-Foliar Crecimiento: 18-28-8 + Edta Y Em, Cosmo-Foliar Llenado: 0-32-43 + Edta Y Em, Desarrollo: 28-7-12, Dol, Engru-S, Fertigro Calcio, Fertinvesa CaB, Fertinvesa Fosfito de Potasio, Fertinvesa K, Fertinvesa P, Fertirriego Solunk-P Clean: 13-3-43 Cristales, Flores y Frutos: 5-10-43 + Em, Fosfato de Potasio 0-40-53, Humiforte N-6, Integrador, Microfoliar Npk, Micronfos: 8-5-0 + Secundarios Y Em, Microrriego Inicio: 15-25-10, Nadir Fos, Nitro Xtend +S 40-0-0-6, Novaplant Ca-B, Novaplant Ca-B-Zn, Nutri-Aminox, Orbiagro, Pastos 5, Poliquel Zinc, Potak 41, Primer Estado: 15-17-15-2(Mgo), Producir Exa 600, Raise-1, R-Llenito, Solucat 10-52-10, Tercer Estado: 24-0-12-3 (Mgo), Treinta y 1 Grado 31-8-8-2+33% (S), Triple Quin- C, Vicor 3, Zincprod, 15-15-15-3 + Em, Fertinvesa N, Inicio: 13-36-12 + Em, Microrriego Producción: 10-3-40, Novaplant Fosforo, 12-24-12, Fosfacel 800: 20-53-0, Microrriego Menores, Soil, Tacol, Jocker Hj & H, Agrofercol efe-agro, Sulfato de Cobre Cristales, Nutri Phite P Foliar, Dkp 500, Cosmoquel Edta-Calcio, Microrriego Ca Mg: 14-0-3-15(Cao)-5(Mgo) Cristales, Azufre 720 Sc, Promotor 40-3-3, Cab, Sembramon 12-20-12-3 (MgO), 15-15-15 + Esm, Grado palmero 13-5-27-5, Rafos 12-24-12-2 (MgO) 1 S, 10-20-20-4, 10-30-10-3, 11-30-11, 12-24-24, 18-18-18 + Esm, 18-18-18-1-2, Abonagro 15-15-15-4, Afek II, Agrimins K Calcio Boro, Amida S (Urea-Sulfato de Amonio), Biozyme TF, CaB, Cosechando, Cosmo-Foliar Crecimiento: 18-28-8 + Edta y Em, Cosmo-Foliar Llenado: 0-32-43 + Edta y Em, Cosmo-R: 14-8-19 + Edta y Em, Desarrollo Sn Cristales, DKP 500, Fertinvesa, Fertiplant, Fertiplant-Mins, Foscrop PK: 0-30-20, Jocker H J & H, Klip - K Calcio, Levante, Mezclas Nórdicas Soluban 13-2-30-2, Microessentials SZ: 12-40-0-10(S), Microfoliar NPK, Micronfos: 8-5-0 + Secundarios y Em, Microrriego Ca Mg: 14-0-3-15(CaO)-5(MgO) Cristales, Nitrabor (Nitrato de Ca+B): 15-0-0-26, Nitrate Balancer, Nitro-K: 13-3-43 Cristales, Platanero: 11-5-27-7-9, Primer Estado: 15-17-15-2(MgO), Prod 17: 17-6-18-2+(S), Rafos 12-24-12-2(MgO) 1S, Roca Fosfórica, Sembramon 12-20-12-3(MgO), Sulfato de Amonio (SAM) 21-0-0-24(S), Tercer Estado: 24-0-12-3(MgO), Treinta y 1: 31-8-8-2+3(S), Zintrac MgB, 12-8-24-3(MgO), Globafol NF, Korn-Kali + B, Mezclas Guayacan: 31-8-8, Nutricarga 19-4-18-3(MgO), 13-26-10, 15-5-30, Nitro Xtend + Mg 39-0-3 + 2(MgO) + 3s, Viva NF, 10-54-10, Microkel Boro, 15-15-15-11(S), Humito P200 Fertil, Poliquel Magnesio + Aa, 15-15-15-10, Actiplant, Amino Gib, Microkel Calcio Boro, Soluplant CaBoK, Soluplant K-Llenado, Soluplant Solufoliar, 12-11-18-3(MgO)-8S+EM, Crecimix: 38-6-3 + Secundarios y Em, NBX+Mo, Todo en Uno NF, K-Tionic, Teprosyn Np+Zn, 20-3-18-3(MgO), CaBtrac, Sikon Fert Cobre Zinc, 12-11-18-3(MgO)-8S+Em, Triple 15 ARAMA

Municipios de los que se tienen datos.

Municipio con reporte de datos para insumos
Bogotá, D.C., Bucaramanga, Cajamarca, Cali, Cáqueza, Chipaque, Choachí, Corinto, Cota, El Carmen de Viboral, El Santuario, Entrerríos, Fómeque, Girón, Guarne, La Ceja, Manizales, Marinilla, Medellín, Palmira, Pamplona, Pasto, Peñol, Popayán, Pupiales, Rionegro, San Vicente Ferrer, Subachoque, Tunja, Túquerres, Ventaquemada, Ábrego, Agustín Codazzi, Chiquinquirá, Ocaña, Piendamó, Villa de San Diego de Ubaté, Andes, Calarcá, Guadalajara de Buga, Ibagué, La Plata, Málaga, Montenegro, Neiva, Quimbaya, Riosucio, San Gil, Santander de Quilichao, Tuluá, Vélez, Chocontá, Samacá, Sibaté, Villapinzón, Armenia, Caicedonia, Granada, Pereira, Santa Rosa de Cabal, Socorro, Barbosa, Belén de Umbría, Cúcuta, Duitama, Facatativá, Ipiales, Jamundí, La Dorada, La Pintada, La Unión, Madrid, Marsella, Moniquirá, Piedecuesta, San Alberto, San Pedro de Los Milagros, Santa Bárbara, Silos, Valledupar, Villanueva, Villavicencio, Yopal, Zipaquirá, Buesaco, Pitalito, El Zulia, Espinal, Puerto López, Lebrija, Garzón, Girardot, Chitagá, Aquitania, La Celia, Santa Rosa de Osos, Sogamoso, Cereté, Fresno, Sevilla, Tibaná, Magangué, Sabana de Torres, Apía, La Virginia, Roldanillo, Betania, Corozal, Pacho, Cartago, Chinácota, Aguachica, Fundación, Chinchiná, El Carmen de Bolívar, Anserma, Cartagena de Indias, Montería, San Vicente de Chucurí, Santa Marta, Cachipay, Chía, Neira, Funza, Saldaña, Viterbo, Puerto Tejada, Sincelejo, La Mesa, Villeta, San Marcos, Sabanalarga, Lérida, Fusagasugá, Guaduas, Sonsón, Yarumal, Cimitarra, Dagua, Garagoa, Sibundoy, Caucasia, Ramiriquí, El Rosal, San Sebastián de Mariquita, Campoalegre, Algeciras, San Bernardo, Salamina, Florencia, El Doncello, Cumbal, San Andrés de Tumaco, Guachucal, Puerto Rico, Guateque, Lorica, Sutamarchán, Toca, Belén, Guática, Chaparral, Líbano, Supía, Córdoba, Pasca, Abejorral, María La Baja, Donmatías, Saravena, Arauca, Arcabuco, Isnos, Turmequé, Rovira, Barranquilla, Galeras, Urrao, Trujillo, Quinchía, Santuario, Aguazul, Paz de Ariporo, Venadillo, Piendamó - Tunía, San José de Cúcuta, Icononzo, Anzoátegui, Tauramena, Guamo

Cambiamos el nombre de las columnas para facilitar el trabajo y filtramos los datos para los departamentos andinos.

departamentos_andinos <- c("Antioquia", "Boyacá", "Cundinamarca", "Norte de Santander", "Santander", 
                           "Tolima", "Huila", "Caldas", "Quindío", "Risaralda", "Nariño")

# cambiando nombres de columnas a algo mas amigable
insumos$Departamento <- insumos$`Nombre departamento`
insumos <- insumos[, !names(insumos) %in% 'Nombre departamento']

insumos$Insumo <- insumos$`Nombre del producto`
insumos <- insumos[, !names(insumos) %in% 'Nombre del producto']


insumos_andino <- insumos %>%
  filter(Departamento %in% departamentos_andinos)

print("Número de registros de insumos andinos")
## [1] "Número de registros de insumos andinos"
nrow(insumos_andino)
## [1] 129415

3.4 Datos históricos de abastecimiento

Las series históricas de abastecimiento tienen 38 variables, la fecha en la cual se tomó la medición, el total de abastecimiento, la variación mensual del abastecimiento, la variación anual del abastecimiento, dos variables de empalme, y de la número 7 a la 38 son distintos mercados en donde se tiene el valor de abastecimiento.

Inicialmente pensamos en relacionar el precio de los productos con los datos de abastecimiento, sin embargo, al revisar los datos de abastecimeinto notamos que el valor era un dato global. Por esta razón decidimos abandonar los análisis. La exploración inicial la realizamos con el script scripts/preciosvsBodegas.R

##🧹​ Extaracción y limpieza

En términos técnicos los datos se encuentran en hojas de cálculo formato Excel, separados por periodos en diferentes archivos y/o hojas de cálculo. Para usarlos y entenderlos de una manera más eficiente, creamos un archivo agrupado, el script usado se encuentra en el directorio scripts. Además de esto, fue necesario hacer conversiones en las variables de fechas para poder realizar los análisis, especialmente las gráficas y la busqueda de relaciones.

La exploración inicial la realizamos de manera visual, el tamaño de los archivos nos permitio visualizarlo y entre otras cosas identificar las hojas y rangos en los que se encontraban los datos de interés.

4 📊​ Visualización: ¿Qué tenemos?

Ya que hemos eliminado los datos nulos y arreglado los datos podemos ver que tienen.

print(names(datos))
## [1] "Fecha"    "Grupo"    "Producto" "Ciudad"   "Mercado"  "Precio"

Nos aseguramos de que por cada año hay aproximadamente la misma cantidad de filas. A excepción de 2023 ya que los datos solo están hasta Octubre.

Los 8 grupos de productos que tenemos estan distribuidos como se muestra en la figura. Nos centraremos principalmente en los productos agricolas que represntan alrededor del 60% de los productos en el dataset.

## [1] "Porcentaje productos agricolas 60.29"
En el grupo de productos agricolas tenemos estos productos:
Grupo Productos
FRUTAS Aguacate común, Aguacate Hass, Aguacate papelillo, Badea, Banano bocadillo, Banano criollo, Banano Urabá, Borojó, Breva, Ciruela negra chilena, Ciruela roja, Coco, Curuba, Curuba redonda, Durazno importado, Durazno nacional, Feijoa, Fresa, Granadilla, Guanábana, Guayaba agria, Guayaba Atlántico, Guayaba común, Guayaba manzana, Guayaba pera, Gulupa, Higo, Kiwi, Limón común, Limón común Ciénaga, Limón común valluno, Limón mandarino, Limón Tahití, Lulo, Mandarina Arrayana, Mandarina común, Mandarina Oneco, Mango común, Mango de azúcar, Mango manzano, Mango reina, Mango Tommy, Manzana nacional, Manzana roja importada, Manzana royal gala importada, Manzana verde importada, Maracuyá, Maracuyá antioqueño, Maracuyá huilense, Maracuyá santandereano, Maracuyá valluno, Melón Cantalup, Mora de Castilla, Naranja común, Naranja Valencia, Papaya hawaiana, Papaya Maradol, Papaya melona, Papaya redonda, Patilla, Pera importada, Pera nacional, Piña gold, Piña manzana, Piña perolera, Pitahaya, Tangelo, Tomate de árbol, Uchuva con cáscara, Uva importada, Uva Isabela, Uva negra, Uva red globe nacional, Uva roja, Uva verde, Zapote, Limón común ecuatoriano, Mango mariquiteño, Piña Cayena, Mango costeño, Mango Kent, Naranja Sweet, Patilla baby, Ciruela negra importada, Papaya tainung, Ciruela importada, Mango Yulima, Guayaba pera valluna, Papaya Paulina, Mandarina arrayana
GRANOS Y CEREALES Arroz de primera, Arroz de segunda, Arroz excelso, Arroz sopa cristal, Arveja amarilla seca importada, Arveja enlatada, Arveja verde seca importada, Cuchuco de cebada, Cuchuco de maíz, Fríjol bolón, Fríjol cabeza negra importado, Fríjol cabeza negra nacional, Fríjol calima, Fríjol cargamanto blanco, Fríjol cargamanto rojo, Fríjol enlatado, Fríjol nima calima, Fríjol palomito importado, Fríjol radical, Fríjol Uribe rosado, Fríjol Zaragoza, Garbanzo importado, Lenteja importada, Maíz amarillo cáscara, Maíz amarillo trillado, Maíz blanco cáscara, Maíz blanco retrillado, Maíz blanco trillado, Maíz enlatado, Maíz pira, Lenteja nacional, Arroz blanco importado, Maíz amarillo retrillado, Maíz amarillo cáscara importado
TUBERCULOS, RAICES Y PLATANOS Arracacha amarilla, Arracacha blanca, Ñame criollo, Ñame diamante, Ñame espino, Papa capira, Papa criolla limpia, Papa criolla para lavar, Papa criolla sucia, Papa ICA-Huila, Papa Morasurco, Papa nevada, Papa parda pastusa, Papa Puracé, Papa roja peruana, Papa rubí, Papa R-12 negra, Papa R-12 roja, Papa sabanera, Papa San Félix, Papa suprema, Papa tocana, Papa tocarreña, Papa única, Plátano comino, Plátano dominico hartón maduro, Plátano dominico hartón verde, Plátano dominico verde, Plátano guineo, Plátano hartón maduro, Plátano hartón verde, Plátano hartón verde ecuatoriano, Plátano hartón verde llanero, Plátano hartón verde venezolano, Ulluco, Yuca chirosa, Yuca criolla, Yuca ICA, Yuca llanera, Papa Betina, Papa superior, Plátano hartón verde Eje Cafetero
VERDURAS Y HORTALIZAS Acelga, Ahuyama, Ají topito dulce, Ajo, Ajo importado, Apio, Arveja verde en vaina, Arveja verde en vaina pastusa, Berenjena, Brócoli, Calabacín, Calabaza, Cebolla cabezona blanca, Cebolla cabezona blanca bogotana, Cebolla cabezona blanca ecuatoriana, Cebolla cabezona blanca importada, Cebolla cabezona blanca pastusa, Cebolla cabezona blanca peruana, Cebolla cabezona roja, Cebolla cabezona roja ecuatoriana, Cebolla cabezona roja importada, Cebolla cabezona roja ocañera, Cebolla cabezona roja peruana, Cebolla junca, Cebolla junca Aquitania, Cebolla junca Berlín, Cebolla junca pastusa, Cebolla junca Tenerife, Cebolla puerro, Cebollín chino, Chócolo mazorca, Cidra, Cilantro, Coles, Coliflor, Espinaca, Fríjol verde bolo, Fríjol verde cargamanto, Fríjol verde en vaina, Haba verde, Habichuela, Habichuela larga, Lechuga Batavia, Lechuga crespa morada, Lechuga crespa verde, Pepino cohombro, Pepino de rellenar, Perejil, Pimentón, Pimentón verde, Rábano rojo, Remolacha, Remolacha bogotana, Remolacha regional, Repollo blanco, Repollo blanco bogotano, Repollo morado, Repollo verde, Tomate chonto, Tomate chonto regional, Tomate larga vida, Tomate riñón, Tomate riñón valluno, Tomate Riogrande, Tomate Riogrande bumangués, Tomate Riogrande ocañero, Zanahoria, Zanahoria bogotana, Zanahoria larga vida, Ahuyamín (Sakata), Repollo blanco valluno, Tomate chonto valluno

Además revisamos que tenemos muchas ciudades y mercados:

print(paste("Ciudades : ", length(unique(datos$Ciudad))))
## [1] "Ciudades :  70"

4.1 ✂️​Reducción el tamaño del dataset: Región andina

Ya que tenemos una gran cantidades de datos, decidimos centrarnos en los principales productos de la región andina de Colombia. Investigando en internet decidimos quedarnos con los productos agricolas afines a esta región. Entonces basaremos nuestro análisis en estos productos:

Grupo Productos
FRUTAS Aguacate común, Aguacate Hass, Aguacate papelillo, Curuba, Curuba redonda, Feijoa, Fresa, Granadilla, Guanábana, Guayaba agria, Guayaba común, Guayaba manzana, Guayaba pera, Higo, Lulo, Mango común, Maracuyá, Mora de Castilla, Papaya Maradol, Pera nacional, Piña gold, Tomate de árbol
GRANOS Y CEREALES Fríjol nima calima, Fríjol radical, Fríjol Uribe rosado, Maíz amarillo cáscara, Maíz amarillo trillado, Maíz blanco trillado
TUBERCULOS, RAICES Y PLATANOS Arracacha amarilla, Arracacha blanca, Papa capira, Papa criolla limpia, Papa criolla sucia, Papa ICA-Huila, Papa nevada, Papa parda pastusa, Papa Puracé, Papa rubí, Papa R-12 negra, Papa R-12 roja, Papa sabanera, Papa San Félix, Papa suprema, Papa tocana, Papa tocarreña, Papa única, Plátano comino, Plátano dominico hartón maduro, Plátano dominico hartón verde, Plátano dominico verde, Plátano guineo, Plátano hartón maduro, Plátano hartón verde, Plátano hartón verde llanero, Plátano hartón verde venezolano, Ulluco, Yuca chirosa, Yuca criolla, Yuca ICA, Yuca llanera
## [1] "Cantidad de productos:  62"
## [1] "Cantidad de mercados  39"

Graficamos el comportamiento desde 2013 a 2023 de algunos productos buscando patrones anuales probablemente causados por el clima y la temporada en que se producen los productos:

p1 = producto_comportamiento_tiempo("Aguacate papelillo")
p2 = producto_comportamiento_ciudades("Aguacate papelillo", 2023)
## `summarise()` has grouped output by 'mes'. You can override using the `.groups`
## argument.
print(p1)

print(p2)

4.1.1 Datos de insumos

Variables disponibles

names(insumos)
##  [1] "Año"                       "Mes"                      
##  [3] "Código departamento"       "Código municipio"         
##  [5] "Nombre municipio"          "Presentación del producto"
##  [7] "Precio promedio"           "Fecha"                    
##  [9] "Departamento"              "Insumo"

Seleccionamos nitrogeno por ser este uno de los insumos más usado en los planes de fertilización y generamos algunos gráficos.

Produto = Nitromag 21-0-0-7

nitrogeno <- filter(insumos, Insumo == "Nitromag 21-0-0-7" & `Nombre municipio` == "Socorro")

hist(nitrogeno$`Precio promedio`, main = "Histograma Precio promedio")

# Historico 
plot(nitrogeno$Fecha, nitrogeno$`Precio promedio`, type = "l", main = "Historico de Nitrogeno para Socorro, Santander", xlab = "Fecha", ylab = "Precio")

# Historico suavizado
ggplot(nitrogeno, aes(x = Fecha, y = `Precio promedio`)) +
  geom_smooth(method = "loess", formula = y ~ x) +
  labs(title = "Historico de Nitrogeno para Socorro, Santander (Suavizado)", x = "Fecha", y = "Precio")

5 🔍​ Análisis

5.1 📉​Filtrar productos por variabilidad

Ahora buscaremos los productos con menor y mayor variablidad en precio a lo largo del tiempo. Para esto escribimos una función para normalizar los precios de un producto respecto al máximo precio de cada año.

# normalizar precios a nivel recional
normalizar_producto_tiempo <- function(nombre_producto){
  # Promedio mensual del precio a nivel regional
  promedios_regional <- datos_agro %>%
    filter(Producto == nombre_producto) %>%
    group_by(Fecha) %>%
    summarize(Promedio = mean(Precio))
  
  # Normalizar los precios para tener valores entre 0 y 1, mas faciles de comparar
  promedios_regional_normalizado <- promedios_regional %>%
    group_by(year = lubridate::year(Fecha)) %>%
    mutate(Promedio_normalizado = (Promedio / (max(Promedio, na.rm = TRUE))))
  
  return(promedios_regional_normalizado)
}

El código que se muestra anteriormente hace lo siguiente:

  1. Por cada producto en el dataset se agrupa por fecha y se obtiene el promedio del precio por año-mes en toda la región andina.

  2. Se normalizan los valores por año de cada producto. Los precios en 2013 serán más bajos que los de 2023 debido a la inflación. Como queremos ver la variabilidad del producto normalizaremos \(precio\_normalizado = \frac{precio}{max(precio \ año)}\)

Con los valores normalizados que retorna esa función podemos calcular la desviación estándar de los productos en el tiempo. Para verlo con un ejemplo con un par de productos:

i = "Papa criolla limpia"
promedios_regional_normalizado = normalizar_producto_tiempo(i)
sd = sd(promedios_regional_normalizado$Promedio_normalizado, na.rm = TRUE)
h <- ggplot() + 
  geom_line(data = promedios_regional_normalizado, aes(x = Fecha, y = Promedio_normalizado), linewidth = 1) +
  labs(title = paste("Precio 2013-2023: ", i, "\n Desviación estándar: ", sd ),
       y="Precio")
print(h)

# para un producto que casi no cambia
i = "Fresa"
promedios_regional_normalizado = normalizar_producto_tiempo(i)
sd = sd(promedios_regional_normalizado$Promedio_normalizado, na.rm = TRUE)
h <- ggplot() + 
  geom_line(data = promedios_regional_normalizado, aes(x = Fecha, y = Promedio_normalizado), linewidth = 1) +
  labs(title = paste("Precio 2013-2023: ", i, "\n Desviación estándar: ", sd ),
       y="Precio")
print(h)

Ahora para todos los productos obtuvimos la desviación estándar, sin embargo notamos que habian varios productos que aparecen en muy pocas ciudades lo que nos da un resultado de baja confiabilidad.

# Calcular desviacion estandar de los precios normalizados
df <- data.frame()

# Normalizar daticos agro por producto 
for (i in unique(datos_agro$Producto)) {
  
  # Ver por año cuantas ciudades tienen ese producto en promedio
  numciudades <- promedioCiudades(i)
  
  # Obtener promedios regionales normalizados
  promedios_regional_normalizado = normalizar_producto_tiempo(i) 
    
  # Calcular desviacion estandar de los precios normalizados
  r <- data.frame(
    Producto = i,
    Promedio_normalizado = mean(promedios_regional_normalizado$Promedio_normalizado, na.rm = TRUE),
    Sd = sd(promedios_regional_normalizado$Promedio_normalizado, na.rm = TRUE),
    Num_ciudades = numciudades
  )
  # Agregar fila al dataframe de resultado
  df <- bind_rows(df, r)
}

Filtrando los productos que aparezcan en promedio al menos en 10 ciudades, buscamos los cinco productos con menor y mayor desviacion estándar.

df <- filter(df, Num_ciudades > 10 )
# Obtenemos n los datos que menos y mas varian
n = 5
menor_sd <- (arrange(df,Sd))
mayor_sd <- (arrange(df,desc(Sd)))

ggplot(df, aes(x = Producto, y = Sd )) +
  geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
  labs(
    title = "Desviación estandar del precio a lo largo del tiempo",
    x = "Producto",
    y = "Desviación estandar"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

kable(head(menor_sd, 5), format = "markdown",  caption = "Productos con menor desviación estándar")
Productos con menor desviación estándar
Producto Promedio_normalizado Sd Num_ciudades
Fresa 0.9394952 0.0430403 13.36364
Maíz blanco trillado 0.9203426 0.0828000 10.54545
Guanábana 0.8669064 0.0980856 14.63636
Guayaba pera 0.8481332 0.1014958 17.00000
Curuba 0.8356012 0.1042286 13.90909
selectos_min <- filter(datos_agro, Producto %in%  menor_sd[0:n,]$Producto)


kable(head(mayor_sd,5), format = "markdown", caption = "Productos con mayor desviación estándar")
Productos con mayor desviación estándar
Producto Promedio_normalizado Sd Num_ciudades
Papa parda pastusa 0.6984575 0.2011734 10.90909
Papa capira 0.7266966 0.1949483 15.63636
Papa criolla limpia 0.7398807 0.1908542 21.00000
Arracacha amarilla 0.7988382 0.1786509 11.09091
Aguacate papelillo 0.7817468 0.1555544 17.00000
selectos_max <- filter(datos_agro, Producto %in%  mayor_sd[0:n,]$Producto)


# Grafica la variacion del precio a lo largo del tiempo
plot_min <- graficar_tiempo_producto(selectos_min, "Menor desviacion")
## `summarise()` has grouped output by 'Fecha'. You can override using the
## `.groups` argument.
plot_mas <- graficar_tiempo_producto(selectos_max, "Mayor desviacion")
## `summarise()` has grouped output by 'Fecha'. You can override using the
## `.groups` argument.
# para graficar en una sola figura
print(plot_min)

print(plot_mas)

Ahora graficando los comportamientos anuales de cada producto

5.1.1 Productos con menor variabilidad

# Graficar por cada producto
for(i in unique(selectos_min$Producto)) {
  plot1 <- producto_comportamiento_tiempo(i)
  print(plot1)
}

5.1.2 Productos con mayor variabilidad

# Graficar por cada producto
for(i in unique(selectos_max$Producto)) {
  plot1 <- producto_comportamiento_tiempo(i)
  print(plot1)
}

5.2 🖇️​Correlación con fertilizantes

Seleccionamos 3 productos para ver su comportamiento respecto al precio del Nitrogeno.

producto <- filter(datos, Ciudad == "Bucaramanga" & Mercado == "Bucaramanga, Centroabastos" & Producto == "Lulo")
producto2 <- filter(datos, Ciudad == "Bucaramanga" & Mercado == "Bucaramanga, Centroabastos" & Producto == "Fresa")
producto3 <- filter(datos, Ciudad == "Bucaramanga" & Mercado == "Bucaramanga, Centroabastos" & Producto == "Papa criolla limpia")


ggplot(producto, aes(x = Fecha, y = Precio)) +
  geom_smooth(method = "loess", formula = y ~ x, color = "orange", label = "Lulo") +
  geom_smooth(data = producto2, aes(x = Fecha, y = Precio), color = "green", label = "Fresa") +
  geom_smooth(data = producto3, aes(x = Fecha, y = Precio), color = "red", label = "Papa criolla") +
  labs(title = "Precio historico de los productos (Suavizado)", x = "Fecha", y = "Total")

Normalizamos los valores para graficar los productos y el precio del insumo.

productoNorm <- producto %>%
  mutate(precio_normalizado = scale(Precio))
producto2Norm <- producto2 %>%
  mutate(precio_normalizado = scale(Precio))
producto3Norm <- producto3 %>%
  mutate(precio_normalizado = scale(Precio))
insumosNorm <- nitrogeno %>%
  mutate(total_normalizado = scale(`Precio promedio`))

productoNorm$Fecha <- as.Date(productoNorm$Fecha, format = "%Y-%m-%d")
producto2Norm$Fecha <- as.Date(producto2Norm$Fecha, format = "%Y-%m-%d")
producto3Norm$Fecha <- as.Date(producto3Norm$Fecha, format = "%Y-%m-%d")


ggplot(insumosNorm, aes(x = Fecha, y = total_normalizado)) +
  geom_smooth(method = "loess", formula = y ~ x) +
  geom_smooth(data = productoNorm, aes(x = Fecha, y = precio_normalizado, label = "Lulo"), color = "orange", label = "Lulo") +
  geom_smooth(data = producto2Norm, aes(x = Fecha, y = precio_normalizado, label = "Fresa"), color = "green") +
  geom_smooth(data = producto3Norm, aes(x = Fecha, y = precio_normalizado, label = "Papa criolla"), color = "red") +
  labs(title = "Nitrogeno y Precio de los Productos (Suavizado)", x = "Fecha", y = "Y")

5.2.1 Correlación

Buscamos si existe una correlacion entre el precio de los productos y los insumos

  1. Merge de ambos datasets para solo tener los datos en comun
merged_data <- merge(selectos_min, insumos_andino, by = c("Departamento", "Fecha"))
  1. crear la matriz de correlacion y ordenar
correlation_matrix <- merged_data %>%
  group_by(Producto, Insumo) %>%
  summarise(correlation = cor(Precio, `Precio promedio`, use = "complete.obs"))
## Warning: There were 33 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `correlation = cor(Precio, `Precio promedio`, use =
##   "complete.obs")`.
## ℹ In group 8: `Producto = "Curuba"`, `Insumo = "12-11-18-3(MgO)-8S+Em"`.
## Caused by warning in `cor()`:
## ! the standard deviation is zero
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 32 remaining warnings.
## `summarise()` has grouped output by 'Producto'. You can override using the
## `.groups` argument.
# Ordenar de mayor a menor
correlation_matrix <- correlation_matrix %>%
  arrange(Producto, desc(abs(correlation)))
  1. Filtrar los m primeros insumos de cada producto
m = 3
top_correlations <- correlation_matrix %>%
  group_by(Producto) %>%
  top_n(m, wt = abs(correlation))


head(top_correlations)